package org.xlp.mvc.util;

import org.xlp.utils.ClassLoaderUtils;
import org.xlp.utils.XLPStringUtil;

/**
 * 简化类操作工具类
 */
public class ClassUtils {
    /**
     * 通过给定的Class名称判断对应的类是否存在
     * @param className 要判断的类名
     * @param classLoader 类加载器
     * @return true 存在，false 不存在
     */
    public static boolean hasClass(String className, ClassLoader classLoader){
        return hasClass(className, classLoader, false);
    }

    /**
     * 通过给定的Class名称判断对应的类是否存在
     * @param className 要判断的类名
     * @param classLoader 类加载器
     * @param initialize  是否初始化
     * @return true 存在，false 不存在
     */
    public static boolean hasClass(String className, ClassLoader classLoader, boolean initialize){
        return forName(className, classLoader, initialize) != null;
    }

    /**
     * 通过给定的Class名称判断对应的类是否存在
     * @param className 要判断的类名
     * @return true 存在，false 不存在
     */
    public static boolean hasClass(String className){
        return hasClass(className, null);
    }

    /**
     * 通过给定的Class名称获取相应的类对象
     * @param className 类名
     * @param classLoader 类加载器
     * @param initialize 是否初始化
     * @return 假如未加加载到相应的类，则返回null，否则返回相应的Class对象
     */
    public static Class<?> forName(String className, ClassLoader classLoader, boolean initialize){
        if (XLPStringUtil.isEmpty(className)) return null;

        classLoader = classLoader == null ? ClassLoaderUtils.getDefaultClassLoader() : classLoader;
        try {
            return Class.forName(className, initialize, classLoader);
        } catch (ClassNotFoundException e) {
            return null;
        }
    }

    /**
     * 通过给定的Class名称获取相应的类对象
     * @param className 类名
     * @param classLoader 类加载器
     * @return 假如未加加载到相应的类，则返回null，否则返回相应的Class对象
     */
    public static Class<?> forName(String className, ClassLoader classLoader){
        return forName(className, classLoader, false);
    }
}
